using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

using DataAccess;
using DataTransferObject;
namespace Business
{
    public enum DocGiaBUSResult
    {
        OK,
        MATHEERROR,
        HOTENERROR,
        GIOITINHERROR,
        DIACHIERROR,
        NGAYSINHERROR,
        HINHANHERROR,
        NGAYLAPTHEERROR,
        NGAYHETHANERROR,
        MALDGERROR,
        TONGNOERROR,
        TINHTRANGNOERROR,
        DAOERROR
    }
    public class clsDocGiaBUS
    {
       // Filed
       private clsDocGiaDAO DocGiaDAO;
        private clsSachBUS SachBUS;
       DataTable dtThayDoiQuyDinh = new DataTable();
       clsThayDoiQuyDinhBUS ThayDoiQuyDinhBUS = new clsThayDoiQuyDinhBUS();
       clsThayDoiQuyDinhDTO ThayDoiQuyDinhDTO = new clsThayDoiQuyDinhDTO();
       object[] obj = new object[10];


       // Contructors
       public clsDocGiaBUS()
       {
           this.DocGiaDAO = new clsDocGiaDAO();
           this.SachBUS = new clsSachBUS();

           //Lấy table Thay đổi quy định.
           dtThayDoiQuyDinh = ThayDoiQuyDinhBUS.DanhSachThayDoiQuyDinh();
           obj = dtThayDoiQuyDinh.Rows[0].ItemArray;
           ThayDoiQuyDinhDTO.TuoiToiDa = (int)obj[0];
           ThayDoiQuyDinhDTO.TuoiToiThieu = (int)obj[1];
           ThayDoiQuyDinhDTO.ThoiHanThe = (int)obj[2];
           ThayDoiQuyDinhDTO.SoNgayMuonToiDa = (int)obj[3];
           ThayDoiQuyDinhDTO.SoSachMuonToiDa = (int)obj[4];
           ThayDoiQuyDinhDTO.TienPhatSachTre = Convert.ToInt64(obj[5]);
       }

       #region Methods

       public bool UpdateTinhTrangNo(clsDocGiaDTO docgia)
       {
           return DocGiaDAO.UpdateTinhTrangNo(docgia);
       }

       //Tìm độc giả trả về đối tượng độc giả.
       public clsDocGiaDTO TimDoiTuongDocGia(String MaThe)
       {
           return DocGiaDAO.TimDoiTuongDocGia(MaThe);
       }

       public bool CapNhatTongNoDocGia(clsDocGiaDTO DocGiaDTO)
       {
           return DocGiaDAO.UpdateTongNo(DocGiaDTO);
       }

       //Tính số ngày mượn 1 quyển sách.
       public double SoNgayMuonMotQuyenSach(DateTime NgayMuon)
       {
           TimeSpan ts = new TimeSpan();

           ts = DateTime.Today - NgayMuon;
           return ts.TotalDays;
       }

       //Tính số ngày trả trễ của một quyển sách.
       public double SoNgayTraTreMotQuyenSach(DateTime HanTra)
       {
           TimeSpan ts = new TimeSpan();

           ts = DateTime.Today - HanTra;
           if (ts.TotalDays > 0)
               return ts.TotalDays;
           return 0;
       }


       //Tìm sách chưa mượn theo mã.
       public DataTable TimSachChuaMuonTheoMa(String MaSach)
       {
           return SachBUS.TimSachChuMuonTheMa(MaSach);
       }

       //Tính ngày hết hạn mượn sách.
       public DateTime TimNgayHetHanMuonSach(DateTime NgayMuon)
       {
           return NgayMuon.AddDays(ThayDoiQuyDinhDTO.SoNgayMuonToiDa);
       }

       public bool KiemTraSoQuyenSachDocGiaDangMuon(clsDocGiaDTO DocGiaDTO)
       {
           clsPhieuMuonSachBUS PhieuMuonSachBUS;
           int SoQuyenSach;

           PhieuMuonSachBUS = new clsPhieuMuonSachBUS();
           SoQuyenSach = PhieuMuonSachBUS.SoQuyenSachDocGiaDangMuon(DocGiaDTO);
           if (SoQuyenSach >= ThayDoiQuyDinhDTO.SoSachMuonToiDa)
               return false;
           return true;
       }

       //Kiểm tra độc giả mượn sách quá hạn.
       public bool KiemTraDocGiaMuonSachQuaHan(clsDocGiaDTO DocGiaDTO)
       {
           clsPhieuMuonSachBUS PhieuMuonSachBUS;
           DataTable dt;

           PhieuMuonSachBUS = new clsPhieuMuonSachBUS();
           dt = PhieuMuonSachBUS.LayDanhSachSachDocGiaDangMuon(DocGiaDTO);
           foreach (DataRow row in dt.Rows)
           {
               Object[] obj;
               DateTime NgayHetHan;

               obj = new Object[20];
               obj = row.ItemArray;

               NgayHetHan = new DateTime();
               NgayHetHan = Convert.ToDateTime(obj[7]);
               if (DateTime.Today > NgayHetHan)
                   return false;
           }

           return true;
       }

        public String TimTenLDGTheoMaLDG(String MaLDG)
        {
            clsLoaiDGBUS LoaiDGBUS = new clsLoaiDGBUS();
            return LoaiDGBUS.TimTenLoaiDocGiaTheoMaLDG(MaLDG);
        }

        public bool KiemTraThoiHanThe(clsDocGiaDTO obj)
        {
            //DateTime NgayHH;
            //int NgayHienTai;
            //int ThangHienTai;
            //int NamHienTai;

            //NgayHH = new DateTime();
            //NgayHH = obj.NgayHetHan;

            //NgayHienTai = DateTime.Today.Day;
            //ThangHienTai = DateTime.Today.Month;
            //NamHienTai = DateTime.Today.Year;

            //if (NamHienTai == NgayHH.Year)
            //{
            //    if (ThangHienTai == NgayHH.Month)
            //    {
            //        if (NgayHienTai > NgayHH.Day)
            //            return false;
            //        return false;
            //    }
            //    if (ThangHienTai > NgayHH.Month)
            //        return false;
            //    return true;
            //}
            //if (NamHienTai > NgayHH.Year)
            //    return false;
            //return true;

            if (DateTime.Today > obj.NgayHetHan)
                return false;
            return true;
        }

        public DateTime NgayHetHan(DateTime NgayLapThe)
        {
            int NgayLT, NgayHH;
            int ThangLT, ThangHH;
            int NamLT, NamHH;

            NgayLT = NgayLapThe.Day;
            ThangLT = NgayLapThe.Month;
            NamLT = NgayLapThe.Year;

            if (ThangLT + ThayDoiQuyDinhDTO.ThoiHanThe > 12)
            {
                ThangHH = (ThangLT + ThayDoiQuyDinhDTO.ThoiHanThe) - 12;
                NamHH = NamLT + 1;
                NgayHH = NgayLT;
            }
            else
            {
                ThangHH = ThangLT + ThayDoiQuyDinhDTO.ThoiHanThe;
                NamHH = NamLT;
                NgayHH = NgayLT;
            }

            return (new DateTime(NamHH, ThangHH, NgayHH));
        }

       public DocGiaBUSResult KiemTraRong(clsDocGiaDTO obj)
       {
           if (obj.MaThe == "")
               return DocGiaBUSResult.MATHEERROR;
           if (obj.HoTen == "")
               return DocGiaBUSResult.HOTENERROR;
           if (obj.GioiTinh == "")
               return DocGiaBUSResult.GIOITINHERROR;
           if (obj.DiaChi == "")
               return DocGiaBUSResult.DIACHIERROR;
           if (obj.HinhAnh == "")
               return DocGiaBUSResult.HINHANHERROR;
           if (obj.MaLDG == "")
               return DocGiaBUSResult.MALDGERROR;
           if (obj.TinhTrangNo == "")
               return DocGiaBUSResult.TINHTRANGNOERROR;
           return DocGiaBUSResult.OK;
       }

        public ThayDoiQuyDinhBUSResult KiemTraTuoi(clsDocGiaDTO obj)
        {
            DateTime NgaySinh = obj.NgaySinh;
            DateTime NgayHienTai = DateTime.Today;

            if (NgayHienTai.Year - NgaySinh.Year > ThayDoiQuyDinhDTO.TuoiToiDa)
                return ThayDoiQuyDinhBUSResult.TUOITOIDAERROR;
            if (NgayHienTai.Year - NgaySinh.Year == ThayDoiQuyDinhDTO.TuoiToiDa) //Nếu năm bằng thì xét tháng.
            {
                if (NgayHienTai.Month > NgaySinh.Month)
                    return ThayDoiQuyDinhBUSResult.TUOITOIDAERROR;
                if (NgayHienTai.Month == NgaySinh.Month) //Nếu tháng bằng thì xét ngày.
                {
                    if (NgayHienTai.Day > NgaySinh.Day)
                        return ThayDoiQuyDinhBUSResult.TUOITOIDAERROR;
                }
            }

            if (NgayHienTai.Year - NgaySinh.Year < ThayDoiQuyDinhDTO.TuoiToiThieu)
                return ThayDoiQuyDinhBUSResult.TUOITOITHIEUERROR;
            if (NgayHienTai.Year - NgaySinh.Year == ThayDoiQuyDinhDTO.TuoiToiThieu) //Nếu năm bằng thì xét tháng.
            {
                if (NgayHienTai.Month < NgaySinh.Month)
                    return ThayDoiQuyDinhBUSResult.TUOITOITHIEUERROR;
                if (NgayHienTai.Month == NgaySinh.Month) //Nếu tháng bằng thì xét ngày.
                {
                    if (NgayHienTai.Day < NgaySinh.Day)
                        return ThayDoiQuyDinhBUSResult.TUOITOITHIEUERROR;
                }
            }
            return ThayDoiQuyDinhBUSResult.OK;
        }

        public int SoSanhNgay(DateTime Ngay1, DateTime Ngay2) //1: Ngày 1 > Ngày 2, 0: Ngày 1 = Ngày 2, -1:Ngày 1 < Ngày 2
        {
            if (Ngay1.Year > Ngay2.Year)
                return 1;
            if (Ngay1.Year < Ngay2.Year)
                return -1;
            if (Ngay1.Month > Ngay2.Month)
                return 1;
            if (Ngay1.Month < Ngay2.Month)
                return -1;
            if (Ngay1.Day > Ngay2.Day)
                return 1;
            if (Ngay1.Day < Ngay2.Day)
                return -1;
            return 0;
        }

        public DocGiaBUSResult TongNoAm(clsDocGiaDTO obj)
        {
            if (obj.TongNo < 0)
                return DocGiaBUSResult.TONGNOERROR;
            return DocGiaBUSResult.OK;
        }

       public DataTable DanhSachDocGia()
       {
           return this.DocGiaDAO.SelectAll();
       }
        public DataTable LayDocGiaDangMuonSach()
       {
           return this.DocGiaDAO.DocGiaDangMuonSach();
       }
        public DataTable DanhSachDocGiaReference()
        {
            return this.DocGiaDAO.SelectAllReference();
        }

       public DocGiaBUSResult ThemDocGia(clsDocGiaDTO obj)
       {
           if (!this.DocGiaDAO.Insert(obj))
               return DocGiaBUSResult.DAOERROR;
           return DocGiaBUSResult.OK;
       }

       public DocGiaBUSResult SuaDocGia(clsDocGiaDTO obj)
       {
           if (!this.DocGiaDAO.Update(obj))
               return DocGiaBUSResult.DAOERROR;
           return DocGiaBUSResult.OK;
       }

       public DocGiaBUSResult XoaDocGia(clsDocGiaDTO obj)
       {
           if (!this.DocGiaDAO.Delete(obj))
               return DocGiaBUSResult.DAOERROR;
           return DocGiaBUSResult.OK;
       }

        public DataTable TimDocGia(clsDocGiaDTO obj)
        {
            return this.DocGiaDAO.TimDocGia(obj);
        }

        public DataTable TimDocGia(String MaThe)
        {
            return this.DocGiaDAO.TimDocGia(MaThe);
        }

        public DataTable LayPhieuMuonSachTheoMaThe(clsDocGiaDTO obj)
        {
            return this.DocGiaDAO.LayPhieuMuonSachTheoMaThe(obj);
        }
       

       #endregion
   }
}
